import authApi from "./auth.js";

// 登录状态管理
const LOGIN_STATUS = {
  NORMAL: 0, // 正常状态
  LOCKED: 1, // 锁定状态
  THROTTLED: 2, // 限流状态
};

class AuthService {
  constructor() {
    this.loginAttempts = 0;
    this.lastLoginTime = null;
    this.lockoutEndTime = null;

    // 配置参数
    this.config = {
      maxAttempts: 5, // 最大尝试次数
      throttleTime: 15 * 60 * 1000, // 限流时间（15分钟）
      lockoutTime: 60 * 60 * 1000, // 锁定时间（1小时）
    };
  }

  // 检查登录状态
  checkLoginStatus() {
    const now = Date.now();

    // 检查是否处于锁定状态
    if (this.lockoutEndTime && now < this.lockoutEndTime) {
      const remainingMinutes = Math.ceil((this.lockoutEndTime - now) / 60000);
      throw new Error(`账号已被锁定，请${remainingMinutes}分钟后再试`);
    }

    // 检查是否需要限流
    if (this.loginAttempts >= this.config.maxAttempts) {
      if (
        this.lastLoginTime &&
        now - this.lastLoginTime < this.config.throttleTime
      ) {
        const remainingMinutes = Math.ceil(
          (this.config.throttleTime - (now - this.lastLoginTime)) / 60000
        );
        throw new Error(`登录次数过多，请${remainingMinutes}分钟后再试`);
      } else {
        // 重置计数
        this.resetAttempts();
      }
    }

    return LOGIN_STATUS.NORMAL;
  }

  // 重置尝试次数
  resetAttempts() {
    this.loginAttempts = 0;
    this.lastLoginTime = null;
  }

  // 记录登录失败
  recordFailedAttempt() {
    this.loginAttempts++;
    this.lastLoginTime = Date.now();

    // 如果失败次数过多，锁定账号
    if (this.loginAttempts >= this.config.maxAttempts * 2) {
      this.lockoutEndTime = Date.now() + this.config.lockoutTime;
      throw new Error(`登录失败次数过多，账号已被锁定1小时`);
    }
  }

  // 处理登录成功
  handleLoginSuccess(res) {
    this.resetAttempts();
    localStorage.setItem("token", res.token);
    localStorage.setItem("userInfo", JSON.stringify(res.userInfo.user));
  }

  // 登录方法
  async login(loginForm) {
    try {
      // 检查登录状态
      this.checkLoginStatus();

      console.log("authApi", authApi);

      // 调用登录接口
      const response = await authApi.login(loginForm);
      console.log("登录成功:", response);

      // 处理登录成功
      this.handleLoginSuccess(response);

      return response;
    } catch (error) {
      // 记录失败尝试
      this.recordFailedAttempt();
      throw error;
    }
  }

  // 登出方法
  async logout() {
    try {
      await authApi.logout();
      localStorage.removeItem("token");
    } catch (error) {
      console.error("登出失败:", error);
      // 即使登出失败，也清除本地token
      localStorage.removeItem("token");
      throw error;
    }
  }

  // 检查是否已登录
  isAuthenticated() {
    return !!localStorage.getItem("token");
  }

  // 获取剩余限制时间
  getRemainingLockTime() {
    const now = Date.now();
    if (this.lockoutEndTime && now < this.lockoutEndTime) {
      return Math.ceil((this.lockoutEndTime - now) / 60000);
    }
    return 0;
  }
}

// 导出单例
export default new AuthService();
